In [1]:
import itertools
from process_bigraph import Composite
from spatio_flux import core
from spatio_flux.viz.plot import plot_time_series, plot_species_distributions_to_gif, plot_species_distributions_with_particles_to_gif
from spatio_flux.processes.dfba import DynamicFBA, get_single_dfba_spec, get_spatial_dfba_state
from spatio_flux.processes.diffusion_advection import DiffusionAdvection, get_diffusion_advection_spec, get_diffusion_advection_state
from spatio_flux.processes.particles import Particles, get_particles_spec, get_particles_state
from spatio_flux.processes.particle_comets import get_particle_comets_state
In [2]:
core.process_registry.list()
Out[2]:
['Particles',
 'DynamicFBA',
 'console-emitter',
 'bounds',
 'ram-emitter',
 'DiffusionAdvection',
 'composite']

Processes¶

dFBA process¶

In [3]:
total_time = 60.0

# get dfba config
single_dfba_config = {
    'dfba': get_single_dfba_spec(path=['fields']),
    'fields': {
        'glucose': 10,
        'acetate': 0,
        'biomass': 0.1
    }
}

# make the simulation
sim = Composite({
    'state': single_dfba_config,
    'emitter': {'mode': 'all'}
}, core=core)

# save the document
sim.save(filename='single_dfba.json', outdir='out')

# simulate
print('Simulating...')
sim.update({}, total_time)

# gather results
dfba_results = sim.gather_results()
Created new file: out/single_dfba.json
Simulating...
In [4]:
print('Plotting results...')
# plot timeseries
plot_time_series(
    dfba_results,
    out_dir='out',
    filename='dfba_single_timeseries.png',
)
Plotting results...
saving out/dfba_single_timeseries.png
No description has been provided for this image

Diffusion advection process¶

In [5]:
total_time = 50
bounds = (10.0, 20.0)
n_bins = (10, 20)

# get the config
composite_state = get_diffusion_advection_state(
    bounds=bounds,
    n_bins=n_bins,
    mol_ids=['glucose', 'acetate', 'biomass'],
    advection_coeffs={
        'biomass': (0, -0.1)
    }
)

# make the composite
print('Making the composite...')
sim = Composite({
    'state': composite_state,
    'emitter': {'mode': 'all'},
}, core=core)

# save the document
sim.save(filename='diffadv.json', outdir='out')

# # save a viz figure of the initial state

# simulate
print('Simulating...')
sim.update({}, total_time)

# gather results
diffadv_results = sim.gather_results()
Making the composite...
Created new file: out/diffadv.json
Simulating...
In [6]:
print('Plotting results...')
# plot 2d video
plot_species_distributions_to_gif(
    diffadv_results,
    out_dir='out',
    filename='diffadv_results.gif',
    title='',
    skip_frames=1
)
Plotting results...
saving out/diffadv_results.gif

Particles process¶

In [7]:
total_time=100
bounds=(10.0, 20.0)  # Bounds of the environment
n_bins=(20, 40)  # Number of bins in the x and y directions
n_particles=20
diffusion_rate=0.1
advection_rate=(0, -0.1)
add_probability=0.4
field_interactions=None
initial_min_max=None

composite_state = get_particles_state(
    bounds=bounds,
    n_bins=n_bins,
    n_particles=n_particles,
    diffusion_rate=diffusion_rate,
    advection_rate=advection_rate,
    add_probability=add_probability,
    field_interactions=field_interactions,
    initial_min_max=initial_min_max,
)

# make the composite
print('Making the composite...')
sim = Composite({
    'state': composite_state,
    'emitter': {'mode': 'all'},
}, core=core)

# save the document
sim.save(filename='particles.json', outdir='out')

# # save a viz figure of the initial state

# simulate
print('Simulating...')
sim.update({}, total_time)

# gather results
particles_results = sim.gather_results()
emitter_results = particles_results[('emitter',)]

particles_history = [p['particles'] for p in emitter_results]
Making the composite...
Created new file: out/particles.json
Simulating...
In [8]:
print('Plotting...')
# plot particles
plot_species_distributions_with_particles_to_gif(
    particles_results,
    out_dir='out',
    filename='particle_with_fields.gif',
    title='',
    skip_frames=1,
    bounds=bounds,
)
Plotting...
saving out/particle_with_fields.gif

Composites¶

Spatial dFBA¶

In [9]:
total_time = 100
n_bins = (5, 5)
mol_ids = ['glucose', 'acetate', 'biomass']

composite_state = get_spatial_dfba_state(
    n_bins=n_bins,
    mol_ids=mol_ids,
)

# make the composite
print('Making the composite...')
sim = Composite({
    'state': composite_state,
    'emitter': {'mode': 'all'}
}, core=core)

# save the document
sim.save(filename='spatial_dfba.json', outdir='out')

# # save a viz figure of the initial state

# simulate
print('Simulating...')
sim.update({}, total_time)

# gather results
dfba_results = sim.gather_results()
Making the composite...
Created new file: out/spatial_dfba.json
Simulating...
In [10]:
print('Plotting results...')
# make video
plot_species_distributions_to_gif(
    dfba_results,
    out_dir='out',
    filename='spatial_dfba_results.gif',
    title='',
    skip_frames=1
)
Plotting results...
saving out/spatial_dfba_results.gif
In [11]:
# plot single traces from spatial dfba
fixed_x = 0
coord_combinations = [(fixed_x, y) for y in range(n_bins[1])]
# coord_combinations = list(itertools.product(range(n_bins[0]), range(n_bins[1])))  # all combinations
plot_time_series(
    dfba_results,
    coordinates=coord_combinations,
    out_dir='out',
    filename='spatial_dfba_timeseries.png',
)
saving out/spatial_dfba_timeseries.png
No description has been provided for this image

COMETS¶

In [12]:
comets_config = {
    'total_time': 10.0,
    # environment size
    'bounds': (10.0, 10.0),
    'n_bins': (10, 10),
    # set fields
    'mol_ids': ['glucose', 'acetate', 'biomass'],
    'initial_min_max': {
        'glucose': (0, 10), 
        'acetate': (0, 0), 
        'biomass': (0, 0.1)
    },
}
In [13]:
# make the composite state
composite_state = get_spatial_dfba_state(
    n_bins=comets_config['n_bins'],
    mol_ids=comets_config['mol_ids'],
    initial_min_max=comets_config['initial_min_max'],
)
composite_state['diffusion'] = get_diffusion_advection_spec(
    bounds=comets_config['bounds'],
    n_bins=comets_config['n_bins'],
    mol_ids=comets_config['mol_ids'],
    default_diffusion_rate=1e-1,
    default_advection_rate=(0, 0),
    diffusion_coeffs=None,  # TODO add all these config options
    advection_coeffs=None,
)

# make the composite
print('Making the composite...')
sim = Composite({
    'state': composite_state,
    'emitter': {'mode': 'all'},
}, core=core)

# save the document
sim.save(filename='comets.json', outdir='out', include_schema=True)

# # save a viz figure of the initial state

# simulate
print('Simulating...')
sim.update({}, total_time)
comets_results = sim.gather_results()
Making the composite...
Created new file: out/comets.json
Simulating...
In [14]:
print('Plotting results...')
# plot 2d video
plot_species_distributions_to_gif(
    comets_results,
    out_dir='out',
    filename='comets_results.gif',
    title='',
    skip_frames=1)
Plotting results...
saving out/comets_results.gif
In [ ]:

In [ ]:

In [ ]:

In [ ]:

In [ ]:

In [15]:
# plot single traces from comets
fixed_x = 0
n_bins = comets_config['n_bins']
coord_combinations = [(fixed_x, y) for y in range(n_bins[1])]
# coord_combinations = list(itertools.product(range(n_bins[0]), range(n_bins[1])))  # all combinations
plot_time_series(
    comets_results,
    coordinates=coord_combinations,
    out_dir='out',
    filename='comets_timeseries.png',
)
saving out/comets_timeseries.png
No description has been provided for this image

Particle-COMETS¶

In [ ]:

In [16]:
total_time = 20
particle_comets_config = {
    # 'total_time': 100.0,
    # environment size
    'bounds': (10.0, 20.0),
    'n_bins': (8, 16),
    # set fields
    'mol_ids': ['glucose', 'acetate', 'biomass', 'detritus'],
    'field_diffusion_rate': 1e-1,
    'field_advection_rate': (0, 0),
    'initial_min_max': {
        'glucose': (10, 10),
        'acetate': (0, 0),
        'biomass': (0, 0.1),
        'detritus': (0, 0)
    },
    # set particles
    'n_particles': 10,
    'particle_diffusion_rate': 1e-1,
    'particle_advection_rate': (0, -0.1),
    'particle_add_probability': 0.3,
    'particle_boundary_to_add': ['top'],
    'field_interactions': {
        'biomass': {
            'vmax': 0.1,
            'Km': 1.0,
            'interaction_type': 'uptake'
        },
        'detritus': {
            'vmax': -0.1,
            'Km': 1.0,
            'interaction_type': 'secretion'
        },
    },
}
In [17]:
# make the composite state
composite_state = get_particle_comets_state(**particle_comets_config)

# make the composite
print('Making the composite...')
sim = Composite({
    'state': composite_state,
    'emitter': {'mode': 'all'},
}, core=core)

# save the document
sim.save(filename='particle_comets.json', outdir='out', include_schema=True)

# # save a viz figure of the initial state

# simulate
print('Simulating...')
sim.update({}, total_time)
particle_comets_results = sim.gather_results()
Making the composite...
Created new file: out/particle_comets.json
Simulating...
In [18]:
print('Plotting results...')
# plot
plot_species_distributions_with_particles_to_gif(
    particle_comets_results,
    out_dir='out',
    filename='particle_comets_with_fields.gif',
    title='',
    skip_frames=1,
    bounds=bounds,
)
Plotting results...
saving out/particle_comets_with_fields.gif